#include <iostream>
#include <DoubleLinkedList.h>
/**以及本来想写一个可以重复使用的main程序，但是在操作的部分实在是太繁琐了…有缘分再把他补充完吧…*/

void ShuRuCuoWu();
void ChuShiHuaLIST(List<int>& L);
void CaoZuo(List<int>& L);
void DaYing( List<int>& L);


int main()
{
  int flag_ceshi = 0;

  List<int> L;

 FLAG:
  ChuShiHuaLIST( L );

  CaoZuo( L );
  
  L.clear();
  std::cout << "是否重新开始测试？\n若是，请输入1.若结束程序，请输入0." << std::endl;
 FLAG1:
  std::cin >> flag_ceshi;
  if(flag_ceshi){
    goto FLAG;  
  }else if(flag_ceshi != 0){
    ShuRuCuoWu();
    goto FLAG1;
  }
  std::cout << "测试结束" << std::endl;
  
  return 0;
}



void ShuRuCuoWu( ){
  std::cout << "你输入了错误的数字，请在下方重新输入" << std::endl;
  return;
}

void ChuShiHuaLIST(List<int>& L){
  std::cout << "创建空白测试用例 " << std::endl;
  std::cout << "请输入List中的元素(测试中默认为整数)" << std::endl;
  int shuru = 0;
  int flag_shuru = 1 ;
  while( flag_shuru ){

    if(flag_shuru==1){
      std::cin >> shuru; 
      L.push_back( shuru );
      DaYing( L );
    }
    std::cout << "是否要继续输入？如果输入，请按1.如果停止输入，请按0." << std::endl;
    std::cin >> flag_shuru;
    
    if( flag_shuru==1 ){
      std::cout <<"请在下方输入List的下一个元素"<< std::endl;
    }else if( flag_shuru!=0){
      ShuRuCuoWu();
    }
    
  }
  std::cout << "您输入的列表为"<< std::endl;
  DaYing( L );
}
  /**<创建初始的List表的程序，让用户提前告知List的长度好像会比较合理。但是感觉又有点单板了，不能体现出List比Vetor更灵活。所以用了一个非常麻烦的方式...*/


void CaoZuo(List<int>& M)
{
  List<int> L = M;
  int flag_caozuo = 1;
  int caozuo = 5;
  int i=0,j=0;
  int element=0;
  std::cout << "在下方输入相应的序号选择想要执行的操作"<< std::endl;
  while(flag_caozuo){
    L.itr = L.begin();
    std::cout << "可执行操作列表\n[1]插入\n[2]删除\n[3]查找\n[4]打印\n[5]结束操作" << std::endl;
    std::cin >> caozuo;
    
    switch( caozuo )
      {
      case 1:
	std::cout << "请输入想要插入的元素" << std::endl;
	std::cin >> element;
	std::cout << "请输入想要插入元素的位置"<< std::endl;
	std::cin >> i;
	if(i<=0){
	  std::cout << "输入的位置不合法，不执行操作" << std::endl;
	  break;
	}
	if(i>(L.size()+1)){
	  std::cout << "您输入的位置超出了数组,无法执行操作" << std::endl;
	  break;
	}
	for(j=1; (j<i)&&( i<= (L.size( )+1)) ;j++){
	  L.itr++;
	}

	L.insert( L.itr , element);
	DaYing( L );
	break;
	
      case 2:
	std::cout << "请输入想要删除元素的位置"<< std::endl;
	std::cin >> i;
	if(i<=0){
	  std::cout << "输入的位置不合法，不执行操作" << std::endl;
	  break;
	}
	if(i>(L.size())){
	  std::cout << "您输入的位置超出了数组,无法执行操作" << std::endl;
	  break;
	}
	//因为这里插入和删除对应的最大位置不一样，写成函数懒得处理参数了。所以直接重复代码
	for(j=1; (j<i)&&(i<=L.size()) ;j++){
	  L.itr++;
	}

	L.erase( L.itr );
	DaYing( L );
	break;
	
      case 3:
	std::cout << "请输入您想要查找的元素" << std::endl;
	std::cin >> element;
	L.find( element );
	break;
	
      case 4:
	DaYing( L );
	break;
	
      case 5:
	flag_caozuo = 0;
	break;
      default:
	ShuRuCuoWu();
	break;
      }
  }
  
}
/**<实现了插入、删除、查找和打印功能*/

void DaYing( List<int>& L){
for(L.itr = L.begin(); L.itr != L.end(); L.itr++){
	  std::cout << *L.itr <<" " ;
	}
	std::cout <<"\n\n";
return;
}
